package design_patterns;

public class Sing {

    //单列设计模式   懒汉模式  、饿汉模式  、双重校验锁


    //
//    public  static Sing instance =null;
//     public static Sing  getInstance(){
//         if (instance==null){
//             instance=new Sing();
//         }
//         return instance;
//    }

    //饿汉单列模式

//    public static Sing instance = new Sing();
//    private Sing() {
//    }
//
//    public static Sing getInstance() {
//        return instance;
//    }
//
//    public void sing() {
//        System.out.println("正在唱歌...");
//    }


    //双重校验所   为什么要用volatile关键字？
    //volatile关键字的作用是：当多个线程同时操作一个变量时，可以保证该变量的可见性，即一个线程修改了变量的值，其他线程能立即得知。
    //volatile关键字主要用于解决指令重排序的问题。
    public static volatile Sing instance = null;

    private Sing() {
    }

    //为什么 getInstance() 方法加了同步锁？
    //因为 getInstance() 方法需要保证线程安全，即多个线程同时调用 getInstance() 方法时，只有一个线程能成功地创建实例，其他线程都需要等待。
    //为了保证线程安全，需要在 getInstance() 方法上加同步锁。
    public static Sing getInstance() {
        if (instance == null) {
            synchronized (Sing.class) {
                if (instance == null) {
                    instance = new Sing();
                }
            }
        }
        return instance;
    }

}
